package com.ym.excel.utils;

import com.ym.excel.domain.*;

import java.io.File;
import java.util.List;
import java.util.Map;

/**
 * Excel 读写操作类
 */
public class ExcelOperator implements ExcelOperatorInte {

    public String writeExcel(List<List<String>> data) throws Exception {
        return writeExcel("", data);
    }

    public String writeExcel(String path, List<List<String>> data) throws Exception {
        return writeExcel(path, "", data);
    }

    public String writeExcel(String path, String fileName, List<List<String>> data) throws Exception {
        return writeExcel(path, fileName, "Sheet1", data);
    }


    /**
     * 写入Excel文件
     *
     * @param path      Excel 存储路径
     * @param fileName  文件名称
     * @param sheetName 文件也签名称
     * @param data      要写入数据内容
     * @return 文件存储路径
     */
    public String writeExcel(String path, String fileName, String sheetName, List<List<String>> data) throws Exception {
        return writeExcel(path, fileName, sheetName, null, data);
    }

    /**
     * 写入Excel文件
     *
     * @param path      Excel 存储路径
     * @param fileName  文件名称
     * @param sheetName 文件也签名称
     * @param title     第一行作为标题 若没有可以为空
     * @param data      要写入数据内容
     * @return 文件存储路径
     */
    public String writeExcel(String path, String fileName, String sheetName, List<String> title, List<List<String>> data) throws Exception {
        return writeExcel(path, fileName, sheetName, title, data, null);
    }

    /**
     * 写入Excel文件
     *
     * @param path       Excel 存储路径
     * @param fileName   文件名称
     * @param sheetName  文件也签名称
     * @param title      第一行作为标题 若没有可以为空
     * @param data       要写入数据内容
     * @param hideColumn 隐藏列
     * @return 文件存储路径
     */
    public String writeExcel(String path, String fileName, String sheetName, List<String> title, List<List<String>> data, Integer[] hideColumn) throws Exception {
        if (data == null || data.size() <= 0) {
            throw new Exception("写入数据不能为空！");
        }
        return ExcelWriter.writeExcel(path, fileName, sheetName, title, data, hideColumn);
    }


    public List<Map<String, String>> readExcel4Result(String path) throws Exception {
        return readExcel4Result(path, null);
    }

    public List<Map<String, String>> readExcel4Result(String path, String sheetName) throws Exception {
        return readExcel4Result(path, sheetName, null);
    }

    /**
     * 读取Excel 指定title, Excel 内容均为数据结果
     *
     * @param path      文件路径
     * @param sheetName sheet 页名称 默认为第一个sheet页
     * @param title     返回map key值。需对应Excel列
     * @return 返回内容列表
     */
    public List<Map<String, String>> readExcel4Result(String path, String sheetName, List<String> title) throws Exception {
        if (isEmpty(path)) {
            throw new Exception("文件路径不能为空！");
        }
        return ExcelReader.readExcel(path, sheetName, title);
    }

    /**
     * 读取Excel 默认第一行作为 title
     *
     * @param path     文件路径
     * @param hasTitle 是否需要返回title 默认为ture。若为 false 则认为Excel 内容均为要返回的数据
     * @return 返回列表 List1 为title, List2 为数据内容
     */
    public List<List<Object>> readExcel4Result(String path, boolean hasTitle) throws Exception {
        if (isEmpty(path)) {
            throw new Exception("文件路径不能为空！");
        }

        return readExcel4Result(path, null, hasTitle);
    }

    /**
     * 读取Excel 默认第一行作为 title
     *
     * @param path      文件路径
     * @param sheetName sheet 页名称 默认为第一页
     * @param hasTitle  是否需要返回title 默认为ture。若为 false 则认为Excel 内容均为要返回的数据
     * @return 返回列表 List1 为title, List2 为数据内容
     */
    public List<List<Object>> readExcel4Result(String path, String sheetName, boolean hasTitle) throws Exception {
        if (isEmpty(path)) {
            throw new Exception("文件路径不能为空！");
        }

        return ExcelReader.readExcel(path, sheetName, hasTitle);
    }

    /**
     * 删除指定文件
     *
     * @param path
     * @return
     * @throws Exception
     */
    public boolean deleteFile(String path) throws Exception {
        if (isEmpty(path)) {
            throw new Exception("文件路径不能为空");
        }
        File file = new File(path);
        if (file == null || !file.exists()) {
            throw new Exception("要删除的文件不存在");
        }
        return file.delete();
    }


    /**
     * 判断字符串为空 或 null
     *
     * @param args
     * @return null 或 空 返回true
     */
    public boolean isEmpty(String args) {
        if (args == null || "".equals(args.trim().length())) {
            return true;
        }
        return false;
    }

}
